<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>

    // 变量分为 全局变量和局部变量
    // 局部变量 在函数内部使用 外部无法访问  局部变量 在函数调用后 会被垃圾回收机制回收 

    // 全局变量 函数外部创建 任意位置可以访问
    // var x = 8;//
    // function say() {
    //   var y = 8;
    //   console.log(y)
    // }
    // say()
    // console.log(y) 

    function add() {
      var x = 8; //
      return function () { //闭包函数
        x++;
        var z = x + 5;
        console.log(z);
      }
    }
    var res = add();
    res();
    res();
    res();

    // 闭包 函数内部的函数  闭包函数
    //  ，使用父级函数的变量，可以让外部访问到局部变量, 使局部变量持久化   不会被垃圾回收机制回收 这就是闭包函数
    //  滥用闭包会导致内存泄漏
    // 闭包应用场景 ： 插件封装  防抖和节流函数应用到了闭包

    //  内存泄漏 内存中存在的 未被使用或调用的 变量或函数 而且不能被清除
    //  js中内存泄漏的场景   闭包  滥用定时器      setTimeout(function(){})  setInterval

    // 垃圾回收机制 浏览器自带的 标记和清除机制
    // 浏览器会定期 标记 未被使用和调用的变量或函数 进行清除





  </script>
</body>

</html>